#include "InterConditions.h"

InterConditions::InterConditions(int _n,vector<double> _X,vector<double> _f)
{
  n=_n;
  X=_X;
  f=_f;
  vector<double> arr(n,0);
  m=arr;
}

InterConditions::InterConditions(int _n,vector<double> _X,vector<double> _f,vector<double> _m,vector<vector<double> > _df)
{
  n=_n;
  X=_X;
  f=_f;
  m=_m;
  df=_df;
}

int InterConditions::sum()const
{
  int s=0;
  for(int i=0;i<n;i++)
    s=s+m[i];
  return s;
}

int InterConditions::factorial(int i)const
{
  int fact=1;
  for(int j=1;j<=i;j++)
    fact=fact*j;
  return fact;
}

int InterConditions::find_id(double x)const
{
  for(int i=0;i<X.size();i++)
    if(X[i]==x)
      return i;
}

vector<double> InterConditions::get_X()const
{
  int M=sum();
  int k=0;
  vector<double> __X(n+M);
  for(int i=0;i<n;i++)
    for(int j=0;j<=m[i];j++)
      {
	__X[k]=X[i];
	k++;
      }
  return __X;
}

vector<double> InterConditions::get_x()const
{
  return X;
}
vector<double> InterConditions::get_f()const
{
  return f;
}

vector<vector<double> > InterConditions::output_difftable()const
{
  int M=sum();
  int k=0;
  double _X[n+M];
  double __f[n+M];
  for(int i=0;i<n;i++)
    for(int j=0;j<=m[i];j++)
      {
	_X[k]=X[i];
	__f[k]=f[i];
	k++;
      }
//for(int i=0;i<n+M-1;i++)
//   for(int j=n+M-1;j>=i+1;j--)
//      {
//	if(_X[j]!=_X[j-i-1])
//	  __f[j]=(__f[j]-__f[j-1])/(_X[j]-_X[j-i-1]);
//	else
//	  {
//	      int index=find_id(_X[j]);
//            __f[j]=F[index][i]/factorial(i+1);
//	      __f[j]=*((double*)F+index*1+i)/factorial(i+1);
//	  }
//      }
    vector<vector<double> > _table(n+M,vector<double>(n+M));
    for(int i=0;i<n+M;i++)
      _table[i][0]=__f[i];
   for(int i=0;i<n+M-1;i++)
    for(int j=i+1;j<n+M;j++)
      {
        if(_X[j]!=_X[j-i-1])
  	  _table[j][i+1]=(_table[j][i]-_table[j-1][i])/(_X[j]-_X[j-i-1]);
       else
  	  {
  	    int index=find_id(_X[j]);
  	    _table[j][i+1]=df[index][i]/factorial(i+1);
  	  }
      }
  return _table;
}

